﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CastleDefender.Platform;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using CastleDefender.ConfigFolder;
using CastleDefender.Platform.ScreenBehavior;

namespace CastleDefender.Object
{
    public partial class Bow : GameObject
    {
        #region VARIABLE

        protected Vector2 vecVectorDirection;
        protected bool blnAttack;
        protected int intTransferPower;
        protected TouchBehavior mtTouch;
        protected Vector2 vecSpearHead;
        protected Rectangle recCaslteBounds;
        protected int intHeart;

        #endregion

        #region CONSTRUCTOR

        public Bow(Game myGame, ref Texture2D texture, int widthFrame, int heightFrame, ref TouchBehavior touch, Vector2 position, Vector2 vectorDirection, int heart)
            : base(myGame, ref texture, widthFrame, heightFrame)
        {
            mtTouch = touch;
            intHeart = heart;
            intTransferPower = 0;
            vecOrigin = new Vector2(widthFrame / 2, heightFrame / 2);
            vecPosition = position;
            vecVectorDirection = vectorDirection;
            //fltRotation = AngleRotation(vectorDirection);

            //Thiết lập bow hình cho đối tượng Bow
            recBounds = new Rectangle((int)(vecPosition.X - vecOrigin.X), (int)(vecPosition.Y - vecOrigin.Y), intWidthFrame, intHeightFrame);
            //Tìm vị trí đầu cùng của mũi tên
            vecSpearHead = FindSpearHead(recBounds, recBounds.Height, vectorDirection);
            
        }
        #endregion

        #region PUBLIC METHOD

        //Hàm update các trạng thái và hành động của Bow
        public override void Update(GameTime gameTime)
        {
            //Thiết lập bow hình cho đối tượng Bow
            recBounds = new Rectangle(60, 0, (int)Config.ScreenSize.X - 50, (int)Config.ScreenSize.Y);
          
            //Cập nhật các trạng thái của Bow
            PullCordOfTheBow();
            base.Update(gameTime);
        }

        #endregion

        #region PROTECTED METHOD

        //Tìm điểm đầu nhọn của cung
        protected Vector2 FindSpearHead(Rectangle bounds, int heightBounds, Vector2 vectorDirection)
        {
            Vector2 result = Vector2.Zero;
            Vector2 temp1 = Vector2.Zero;
            Vector2 temp2 = Vector2.Zero;

            //trường hợp đặc biệt
            if (vectorDirection.Y == 0)
            {
                temp1.Y = temp2.Y = (int)bounds.Center.Y;
                temp1.X = (int)bounds.Center.X + heightBounds / 2;
                temp2.X = (int)bounds.Center.X - heightBounds / 2;
            }
            else
            {
                double c = vectorDirection.X / vectorDirection.Y;
                float d = (float)(Math.Sqrt(Math.Pow(c, 2) + 1));

                //Điểm thứ I cần xét
                temp1.X = (int)((vectorDirection.X / vectorDirection.Y) * (heightBounds / 2) / d + bounds.Center.X);
                temp1.Y = (int)((heightBounds / 2) / d + bounds.Center.Y);

                //Điểm thứ II cần xét
                temp2.X = (int)(-(vectorDirection.X / vectorDirection.Y) * (heightBounds / 2) / d + bounds.Center.X);
                temp2.Y = (int)(-(heightBounds / 2) / d + bounds.Center.Y);
            }

            //Kiểm tra điểm thỏa điều kiện hợp với điểm giữa khung hình đúng bằng vector chỉ phương
            if ((temp1.X - bounds.Center.X) * vectorDirection.X >= 0 && (temp1.Y - bounds.Center.Y) * vectorDirection.Y >= 0)
            {
                result = temp1;
            }
            else
            {
                result = temp2;
            }

            return result;
        }

        #endregion

        #region PRIVATE METHOD

        //Chuyển các frame hình khi kéo dây cungs
        private void PullCordOfTheBow()
        {
            Point posTouch = new Point((int)mtTouch.PosCurrent.X, (int)mtTouch.PosCurrent.Y);

            if (mtTouch.IsMoved && recBounds.Contains(posTouch) && !blnAttack)
            {
                mtTouch.IsControlled = true;

                //vector chỉ hướng 
                vecVectorDirection = Config.BowInitPosition - mtTouch.PosCurrent;

                //Góc quay
                fltRotation = AngleRotation(vecVectorDirection);

                //Năng lượng
                intTransferPower = (int)(vecVectorDirection.Length() * 0.8f);
                intTransferPower = (intTransferPower >= Config.BowMaxPower) ? Config.BowMaxPower : intTransferPower;

                //Chuyển các frame hình khi tác động vào Bow theo năng lượng tính toán được
                intState = Config.BowAttackState;
                intActiveFrame = intTransferPower / (Config.BowDeltaPower + 1);
            }
            else
            {
                //Không chạm vào cung
                mtTouch.IsControlled = false;
            }

            //Phát cờ hiệu bắn tên khi năng lượng truyền đi khác 0 
            if (intTransferPower != 0 && !mtTouch.IsMoved)
            {
                blnAttack = true;
            }

        }

        //Sau khi bắn một mũi tên
        public void Shot(bool arrowAttack)
        {
            if (arrowAttack)
            {
                blnAttack = false;
                intTransferPower = 0;
                intActiveFrame = 0;
                //vecSpearHead = FindSpearHead(recBounds, recBounds.Height, vecVectorDirection);
            }
        }
        #endregion

        #region PUBLIC PROPERTIES

        //Nhận trả giá trị cờ hiệu biến blnAttack
        public bool Attack
        {
            get { return blnAttack; }
            set { blnAttack = value; }
        }

        //Nhận trả giá trị biến vecVectorDirection
        public Vector2 VectorDirection
        {
            get { return vecVectorDirection; }
            set { vecVectorDirection = value; }
        }

        //Nhận trả giá trị biến intTransferPower
        public int Power
        {
            get { return intTransferPower; }
            set { intTransferPower = value; }
        }

        //Trả giá trị biến blnTouchBow
        public bool Touch
        {
            get { return mtTouch.IsControlled; }
        }

        //Nhận trả giá trị biến recCaslteBounds
        public Rectangle CaslteBounds
        {
            get { return recCaslteBounds; }
            set { recCaslteBounds = value; }
        }

        //Nhận trả giá trị intHeart
        public int Heart
        {
            get { return intHeart; }
            set { intHeart = value; }
        }
        #endregion

    }
}
